package main

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)

// 定义ANSI颜色常量
// ANSI转义序列用于在支持的控制台中显示彩色文本
const (
	colorRed    = "\033[31m" // 红色 - 用于错误级别日志
	colorGreen  = "\033[32m" // 绿色 - 用于信息级别日志
	colorYellow = "\033[33m" // 黄色 - 用于警告级别日志
	colorBlue   = "\033[34m" // 蓝色 - 用于调试级别日志
	colorReset  = "\033[0m"  // 重置颜色 - 恢复默认终端颜色
)

// encodeLevel 自定义日志级别颜色编码器
// 参数说明：
// - level: 当前日志的级别
// - enc: 编码器，用于将日志级别以特定格式添加到输出中
// 功能：根据不同的日志级别，为控制台输出添加不同的颜色标识
func encodeLevel(level zapcore.Level, enc zapcore.PrimitiveArrayEncoder) {
	switch level {
	case zapcore.DebugLevel: // 调试级别-蓝色
		enc.AppendString(colorBlue + "DEBUG" + colorReset)
	case zapcore.InfoLevel: // 信息级别-绿色
		enc.AppendString(colorGreen + "INFO" + colorReset)
	case zapcore.WarnLevel: // 警告级别-黄色
		enc.AppendString(colorYellow + "WARN" + colorReset)
	// 将所有严重级别（错误、宕机、致命错误）都用红色标识
	case zapcore.ErrorLevel, zapcore.DPanicLevel, zapcore.PanicLevel, zapcore.FatalLevel: // 错误级别-红色
		enc.AppendString(colorRed + "ERROR" + colorReset)
	default: // 其他级别使用默认格式
		enc.AppendString(level.String())
	}
}

// main 函数演示如何实现彩色日志输出
// 通过自定义日志级别编码器，使不同级别的日志在控制台中显示不同颜色
func main() {
	// 创建开发环境配置
	cfg := zap.NewDevelopmentConfig()
	// 设置日志级别显示格式（使用自定义颜色编码）
	// 将自定义的encodeLevel函数注册为日志级别编码器
	cfg.EncoderConfig.EncodeLevel = encodeLevel

	// 构建日志记录器
	logger, _ := cfg.Build()

	// 输出不同级别的彩色日志
	logger.Debug("dev debug log") // 调试信息 - 蓝色显示
	logger.Info("dev info log")   // 一般信息 - 绿色显示
	logger.Warn("dev warn log")   // 警告信息 - 黄色显示
	logger.Error("dev error log") // 错误信息 - 红色显示
}
